跳到主要内容
  1. 开发随笔/

usb2can on Ubuntu

·2 分钟

IMG-20250114171043624.jpg

一、安装必要的软件包 #

Python-can #

sudo apt-get update
sudo apt-get install python3 python3-pip
pip3 install python-can

成功安装python-can库后,可能出现关于脚本路径的警告,提示我们添加环境变量。 在.bashrc添加语句并source

export PATH=$PATH:/home/semitia/.local/bin

can-utils工具 #

sudo apt-get install can-utils

二、测试CAN转USB设备 #

1. 检查USB设备 #

使用lsusb命令查看系统是否识别到你的USB设备:

lsusb

2. 检查网络接口 #

使用ip link命令查看系统中是否存在CAN网络接口:

ip link

查找类似can0的接口。如果存在,则表示系统已经识别到你的CAN设备并创建了相应的网络接口。

3. 使用dmesg查看系统日志 #

可以使用dmesg命令查看系统日志,了解设备连接时的详细信息:

dmesg | grep can

4. 配置和启动CAN接口 #

如果已经检测到设备,可以使用以下命令配置和启动CAN接口(假设设备名为can0):

sudo ip link set can0 up type can bitrate 1000000

6. 收发测试 #

使用candump命令监听CAN总线上的消息:

candump can0

若CAN设备和连接正常,则能够看到总线上传输的消息。 如果有两个设备,可以使用cansend命令通过另一个设备发送消息:

cansend can1 123#12345678

这将发送4个字节数据,ID为0x123,接收效果如下。

  can0  123   [4]  12 34 56 78

7. 检查设备状态 #

显示CAN接口的详细状态信息,包括配置和错误统计数据。

ip -details link show can0

三、使用Python-can库 #

import can
import time
import threading

# 设置CAN接口的配置
can0_config = {
    'interface': 'socketcan',
    'channel': 'can0',
    'bitrate': 500000
}

can1_config = {
    'interface': 'socketcan',
    'channel': 'can1',
    'bitrate': 500000
}

# 定义要发送的消息
messages = [
    "Hello from CAN0!",
    "Greetings from CAN1!",
    "CAN is fun!",
    "Let's communicate!"
]

def can_sender(bus, msg_id, message):
    data = [ord(c) for c in message]  # 将字符串转换为字节数组
    msg = can.Message(arbitration_id=msg_id, data=data[:8], is_extended_id=False)
    try:
        bus.send(msg)
        print(f"Message sent on {bus.channel_info}: ID={msg_id} Data={message}")
    except can.CanError:
        print("Message NOT sent")

def can_receiver(bus):
    while True:
        msg = bus.recv()
        if msg:
            received_message = ''.join(chr(byte) for byte in msg.data)
            print(f"Message received on {bus.channel_info}: {received_message}")

def main():
    # 创建CAN总线对象
    can0 = can.Bus(**can0_config)
    can1 = can.Bus(**can1_config)

    # 启动接收线程
    receiver_thread_0 = threading.Thread(target=can_receiver, args=(can0,))
    receiver_thread_1 = threading.Thread(target=can_receiver, args=(can1,))
    receiver_thread_0.start()
    receiver_thread_1.start()

    # 发送消息
    for message in messages:
        can_sender(can0, 0x100, message)
        time.sleep(1)  # 休息一段时间以避免发送冲突
        can_sender(can1, 0x200, message)
        time.sleep(1)

    # 允许一些时间来接收消息
    time.sleep(5)

    # 关闭CAN总线
    can0.shutdown()
    can1.shutdown()
    return

if __name__ == "__main__":
    main()

四、关闭设备 #

    sudo ip link set can0 down
    sudo ip link set can1 down

Updater - CANable

扒一个超棒的stm32的开源usb-can项目,canable及PCAN固件-CSDN博客

rbei-etas/busmaster: BUSMASTER is an Open Source Software tool to simulate, analyze and test data bus systems such as CAN. BUSMASTER was conceptualized, designed and implemented by Robert Bosch Engineering and Business Solutions (RBEI). Presently it is a joint project of RBEI and ETAS GmbH. (github.com)

cangaroo - GitCode

Makerbase CANable V2.0在Window系统使用_canable 2.0-CSDN博客

CANable updater #

linux #

sudo nano /etc/udev/rules.d/48-stm-dfu.rules
# 添加
SUBSYSTEMS=="usb", ATTR{idVendor}=="0483", ATTR{idProduct}=="df11", MODE:="0666"
sudo udevadm control --reload-rules
sudo udevadm trigger